package com.atguigu.jinx.conf;

import com.atguigu.jinx.exception.BusinessException;
import com.atguigu.jinx.utils.R;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

/**
 * @author ASUS
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {


    // 处理方法参数（@Validated）校验异常
    @ExceptionHandler(ConstraintViolationException.class)
    public R handleConstraintViolationException(ConstraintViolationException ex) {
        // 取第一个错误提示
        String message = ex.getConstraintViolations().iterator().next().getMessage();
        log.error(message);
        return R.error(message);
    }

    // 处理方法参数（@Validated）校验异常
    @ExceptionHandler(IllegalAccessException.class)
    public R handleIllegalAccessException(IllegalAccessException ex) {
        // 取第一个错误提示
        String message = ex.getMessage();
        log.error(message);
        return R.error(message);
    }

    // 处理方法参数（@Validated）校验异常
    @ExceptionHandler(IllegalArgumentException.class)
    public R handleIllegalArgumentException(IllegalArgumentException ex) {
        // 取第一个错误提示
        String message = ex.getMessage();
        log.error(message);
        return R.error(message);
    }

    /**
     * 自定义业务异常
     *
     * @param ex 异常
     * @return 结果
     */
    @ExceptionHandler(BusinessException.class)
    public R handleBusinessException(BusinessException ex) {
        log.error(ex.getMessage());
        return R.error(ex.getMessage());
    }


    // 处理请求体对象（@Valid）校验异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        // 取第一个错误提示
        String message = ex.getBindingResult().getFieldError().getDefaultMessage();
        log.error(message);
        return R.error(message);
    }

    // 处理全局异常
    @ExceptionHandler(Exception.class)
    public R handleGlobalException(Exception ex) {
        log.error("异常: {}", ex.getMessage(), ex);
        return R.error("系统出现异常");
    }

    // 文件太大的异常
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public R handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        log.error("异常: {}", e.getMessage(), e);
        return R.error("文件大小超出限制，请上传不超过10MB的文件");
    }
}
